package model.dao;

import java.sql.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import model.ConnectionFactory;
import model.beans.Usuario;
import model.beans.Usuario;

public class UsuarioDAO {
    private Connection con;
    private PreparedStatement stmtInserir;
    private PreparedStatement stmtAtualizar;
    private PreparedStatement stmtDeletar;
    private PreparedStatement stmtListar;
    private PreparedStatement stmtBuscarPorCodigo;
    private PreparedStatement stmtValidar;
    private PreparedStatement stmtAlterarSenha;
    private PreparedStatement stmtConsultas;
    
    public UsuarioDAO() throws Exception{
        con = ConnectionFactory.getConnection();
    }
    
    public UsuarioDAO(Connection con) throws Exception{
        this.con = con;        
    }
    
    public void inserir(Usuario usuario) throws SQLException{
       stmtInserir = con.prepareStatement("INSERT INTO usuario(nome, email, telefone, celular, dataNasc, endereco, login, senha, tipo) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);");
       
       stmtInserir.setString(1, usuario.getNome());
       stmtInserir.setString(2,usuario.getEmail());
       stmtInserir.setString(3, usuario.getTelefone());
       stmtInserir.setString(4, usuario.getCelular());
       stmtInserir.setDate(5, new java.sql.Date(usuario.getDataNasc().getTime()));
       stmtInserir.setString(6, usuario.getEndereco());
       stmtInserir.setString(7, usuario.getLogin());
       stmtInserir.setString(8, usuario.getSenha());
       stmtInserir.setInt(9, usuario.getTipo());
       stmtInserir.executeUpdate();      
       
       stmtInserir.close();
    }
    
    public void atualizar(Usuario usuario) throws SQLException{
       stmtAtualizar = con.prepareStatement("UPDATE usuario SET nome = ? , email = ? , telefone = ? , celular = ? , dataNasc = ? , endereco = ? , login = ? , tipo = ? WHERE idUsuario = ? ;");
       // Essa função agora passou a NÃO atualizar a senha!
       stmtAtualizar.setString(1, usuario.getNome());
       stmtAtualizar.setString(2,usuario.getEmail());
       stmtAtualizar.setString(3, usuario.getTelefone());
       stmtAtualizar.setString(4, usuario.getCelular());
       stmtAtualizar.setDate(5, new java.sql.Date(usuario.getDataNasc().getTime()));
       stmtAtualizar.setString(6, usuario.getEndereco());
       stmtAtualizar.setString(7, usuario.getLogin());
       stmtAtualizar.setInt(8, usuario.getTipo());
       stmtAtualizar.setInt(9, usuario.getId());
       stmtAtualizar.executeUpdate();    
       
       stmtAtualizar.close();
    }
    
    public boolean alterarSenha(int idUsuario, String senhaAntiga, String novaSenha) throws SQLException{
        int linhas = 0;
        stmtAlterarSenha = con.prepareStatement("UPDATE usuario SET senha = ? WHERE idUsuario = ? AND senha = ?");
        stmtAlterarSenha.setString(1, novaSenha);
        stmtAlterarSenha.setInt(2, idUsuario);
        stmtAlterarSenha.setString(3, senhaAntiga);
        linhas = stmtAlterarSenha.executeUpdate();
       if(linhas == 0)
            return false;
       else 
            return true;       
    }
    
    public void deletar(int id) throws SQLException{
        stmtDeletar = con.prepareStatement("DELETE FROM usuario WHERE idUsuario = ? ;");
        stmtDeletar.setInt(1,id);
        stmtDeletar.executeUpdate();
        stmtDeletar.close();
    }
    
    public List<Usuario> listar() throws SQLException, ParseException{
        stmtListar = con.prepareStatement("SELECT * FROM usuario;");
        
        ResultSet rs = stmtListar.executeQuery();
        List<Usuario> lista = new ArrayList();
        
        while(rs.next()){
            Usuario usuario = new Usuario();
            java.util.Date data =(Date)rs.getDate("dataNasc");
            
            usuario.setDataNasc(data);
            usuario.setId(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
            usuario.setTipo(rs.getInt("tipo"));
            usuario.setTelefone(rs.getString("telefone"));
            usuario.setCelular(rs.getString("celular"));
            usuario.setEmail(rs.getString("email"));
            usuario.setEndereco(rs.getString("endereco"));
            
            lista.add(usuario);
        }
        stmtListar.close();
        return lista;
    }
    
    public Usuario buscarPorCodigo(int id) throws SQLException, ParseException{
        stmtBuscarPorCodigo = con.prepareStatement("SELECT * FROM usuario WHERE idUsuario = ? ;");
        Usuario usuario = new Usuario();
        stmtBuscarPorCodigo.setInt(1, id);
        ResultSet rs = stmtBuscarPorCodigo.executeQuery();
         if(rs.next()){
            java.util.Date data =(Date)rs.getDate("dataNasc");
            
            usuario.setDataNasc(data);
            usuario.setId(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
            usuario.setTipo(rs.getInt("tipo"));
            usuario.setTelefone(rs.getString("telefone"));
            usuario.setCelular(rs.getString("celular"));
            usuario.setEmail(rs.getString("email"));
            usuario.setEndereco(rs.getString("endereco"));
         }
        stmtBuscarPorCodigo.close();
        return usuario;
    }
    
    public Usuario ValidaLogin(String login, String senha) throws SQLException{
        stmtValidar = con.prepareStatement("SELECT * FROM usuario WHERE login LIKE ? AND senha LIKE ? ;");
        Usuario usuario = new Usuario();
        String strLoginParam = login;
        String strSenhaParam = senha;
        
        stmtValidar.setString(1, strLoginParam);
        stmtValidar.setString(2, strSenhaParam);
        ResultSet rs = stmtValidar.executeQuery();
        
        if(rs.next()){
            java.util.Date data =(Date)rs.getDate("dataNasc");
            
            usuario.setDataNasc(data);
            usuario.setId(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setLogin(rs.getString("login"));
            usuario.setTipo(rs.getInt("tipo"));
            usuario.setTelefone(rs.getString("telefone"));
            usuario.setCelular(rs.getString("celular"));
            usuario.setEmail(rs.getString("email"));
            usuario.setEndereco(rs.getString("endereco"));
        }else{
            //login inválido!
            usuario.setId(0);
        }
        stmtValidar.close();
        return usuario;
    }
    
    public boolean consultas(int id) throws SQLException{
        stmtConsultas = con.prepareStatement("SELECT * FROM usuario u, consulta co WHERE u.idUsuario = co.idUsuario AND u.idUsuario = ?");
        stmtConsultas.setInt(1, id);
        ResultSet rs = stmtConsultas.executeQuery();
        if(rs.next()){
            return false;
        }else{
            return true;
        }
    }
}
